/*
 * Copyright 2024 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.gitee.joyz.api.result.util;

import io.gitee.joyz.api.result.ResultContextHolder;
import io.gitee.joyz.api.result.ResultVO;
import io.gitee.joyz.api.result.Resultant;
import io.gitee.joyz.api.result.ResultantStatus;

/**
 * @author JoyZ
 */
public final class ResultUtils {

    private final static ResultContextHolder contextHolder = ResultContextHolder.instance();

    /**
     * 返回成功状态的统一返回结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @return 返回成功状态的统一返回结果实例
     */
    public static Resultant success() {
        return success(null);
    }

    /**
     * 返回成功状态结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param data 载荷
     * @return 返回成功状态的统一返回结果实例
     */
    public static <T> ResultVO<T> success(T data) {
        return locale(Boolean.TRUE, contextHolder.getDefaultStatus(), data, null, null);
    }


    /**
     * 返回失败状态结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param status 返回结果状态枚举实例
     * @return 返回失败状态
     */
    public static Resultant failure(ResultantStatus status) {
        return failure(status, null);
    }

    /**
     * 返回失败状态结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param status 返回结果状态枚举实例
     * @param data   载荷
     * @return 返回失败状态
     */
    public static <T> ResultVO<T> failure(ResultantStatus status, T data) {
        return failure(status, data, null);
    }

    /**
     * 返回失败状态结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param status    返回结果状态枚举实例
     * @param data      载荷
     * @param arguments 国际化参数
     * @return 返回失败状态
     */
    public static <T> ResultVO<T> failure(ResultantStatus status, T data, Object[] arguments) {
        return failure(status, data, arguments, null);
    }


    /**
     * 返回失败状态结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param status         返回结果状态枚举实例
     * @param data           载荷
     * @param arguments      国际化参数
     * @param defaultMessage 国际化默认消息
     * @return 返回失败状态
     */
    public static <T> ResultVO<T> failure(ResultantStatus status, T data, Object[] arguments, String defaultMessage) {
        return locale(Boolean.FALSE, status, data, arguments, defaultMessage);
    }

    /**
     * 返回统一返回结果实例, 并使用消息国际化组件对其消息进行国际化处理
     *
     * @param success        是/否成功
     * @param status         返回结果状态枚举实例
     * @param data           载荷
     * @param arguments      国际化参数
     * @param defaultMessage 国际化默认消息
     * @return 返回统一返回结果实例
     */
    public static <T> ResultVO<T> locale(Boolean success, ResultantStatus status, T data, Object[] arguments, String defaultMessage) {

        ResultVO<T> vo = new ResultVO<>();
        vo.setCode(status.getCode());
        vo.setMsg(contextHolder.getMessage(status.getMsg(), arguments, defaultMessage, contextHolder.getLocale()));
        vo.setData(data);
        vo.setSuccess(success);

        return vo;
    }
}
